home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / lboss03.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  26KB  |  923 lines

  1. /* 3面ボス */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../entry.h"
  11. #include "../sound.h"
  12. #include "../psearch.h"
  13.  
  14.  
  15. #define SPEED_1        3    /* 加速度 */
  16. #define SPEED_1N    28    /* 加速度を足す回数 */
  17. #define SPEED_2        15    /* 加速度 */
  18. #define SPEED_2N    10    /* 加速度を足す回数 */
  19.  
  20. #define SPEED_3        3    /* 3段階目(撤退)の加速度 */
  21. #define SPEED_3N    32    /* 3段階目の加速度を足す回数 */
  22.  
  23.  
  24. #define SPEED_SHOT1    8    /* 1段階目扇型弾速度 */
  25. #define SPEED_SHOT2    10    /* 1段階目弾の速度 */
  26. #define SPEED_SHOT3    14    /* 1段階目弾の速度 */
  27. #define SPEED_SHOT4    10    /* 第2形態・三角弾の速度 */
  28.  
  29. #define SPEED_SHOT9_01    14    /* 第2形態・らせん弾(低速)の速度 */
  30. #define SPEED_SHOT9_02    20    /* 第2形態・らせん弾(高速)の速度 */
  31.  
  32. #define SPEED_SHOT9_11    20    /* 第2形態・らせん弾(高速)の速度 */
  33. #define SPEED_SHOT9_12    10    /* 第2形態・らせん弾(高速)の速度 */
  34.  
  35. #define SPEED_SHOT9_21    8    /* 第2形態・円形弾の速度 */
  36. #define SPEED_SHOT9_22    14    /* 第2形態・円形弾の速度 */
  37. #define SPEED_SHOT9_23    20    /* 第2形態・円形弾の速度 */
  38. #define SPEED_SHOT9_24    26    /* 第2形態・円形弾の速度 */
  39.  
  40.  
  41. #define HP_0    5000        /* 耐久力 */
  42.  
  43. #define TIMER_TIMEOUT    9000    /* これ以上時間が経過したら撤退 */
  44.  
  45. #define SEQ_TIMEOUT    10
  46. #define SEQ_DEATH    11
  47.  
  48.  
  49.  
  50. enum {
  51.     MOVETO_INIT = 0,    /* 初期状態 */
  52.     MOVETO_C2L,        /* 中央から左に移動 */
  53.     MOVETO_L2C,
  54.     MOVETO_C2R,
  55.     MOVETO_R2C
  56. };
  57.  
  58. enum {
  59.     ATTACK_UPPER_CORE = 0,    /* 上のコアから攻撃(伸びる弾) */
  60.     ATTACK_LOWER_CORE    /* 下のコアから攻撃(ばらまき弾) */
  61. };
  62.  
  63. static short EnemyMoveLBoss03 (ENEMY *);
  64. static void EnemyTiniLBoss03 (ENEMY *);
  65.  
  66.  
  67. void EnemyInitLBoss03 (ENEMY * p)
  68. {
  69.     p->vx = 0;
  70.     p->vy = 3 << 16;
  71.  
  72.     /* 初期状態の当り判定 */
  73.     p->hit_px = p->hit_py = p->hit_sx = p->hit_sy = p->hit_cx = 0;
  74.     p->timer = 0;
  75.     p->damage = 0;
  76.     p->flash = 0;
  77.     p->hp = HP_0;
  78.     p->pt = obj_lboss03;
  79.     p->core_pt = sp_core01;
  80.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS_CORE;
  81.     p->seq = 0;
  82.     p->func_enemy_move = EnemyMoveLBoss03;
  83.     p->func_enemy_tini = EnemyTiniLBoss03;
  84.  
  85.     p->parts1 = p->parts2 = p->parts3 = p->parts4 = 0;
  86.  
  87.     if (p->arg == 0)
  88.         p->work4 = PALET_LBOSS03 | PRIORITY_BOSS;
  89.     else
  90.         p->work4 = PALET_LBOSS03_1 | PRIORITY_BOSS;
  91.  
  92.     entry_counter_stop = !0;/* エントリーカウンター停止 */
  93. }
  94.  
  95.  
  96.  
  97. static short EnemyMoveLBoss03 (ENEMY * p)
  98. {
  99.     /* コアが外側にある時の座標 */
  100.     signed short core_table1[33][2] =
  101.     {
  102.         {0, 45},
  103.         {8, 45},
  104.         {17, 42},
  105.         {25, 38},
  106.         {32, 32},
  107.         {38, 25},
  108.         {42, 17},
  109.         {45, 8},
  110.         {45, 0},
  111.         {45, -8},
  112.         {42, -17},
  113.         {38, -25},
  114.         {32, -32},
  115.         {25, -38},
  116.         {17, -42},
  117.         {8, -45},
  118.         {0, -45},
  119.         {-8, -45},
  120.         {-17, -42},
  121.         {-25, -38},
  122.         {-32, -32},
  123.         {-38, -25},
  124.         {-42, -17},
  125.         {-45, -8},
  126.         {-45, 0},
  127.         {-45, 8},
  128.         {-42, 17},
  129.         {-38, 25},
  130.         {-32, 32},
  131.         {-25, 38},
  132.         {-17, 42},
  133.         {-8, 45},
  134.         {0, 45},
  135.     };
  136.     /* コアが内側にある時の座標 */
  137.     signed short core_table2[33][2] =
  138.     {
  139.         {0, 9},
  140.         {1, 8},
  141.         {3, 8},
  142.         {5, 7},
  143.         {6, 6},
  144.         {7, 5},
  145.         {8, 3},
  146.         {8, 1},
  147.         {9, 0},
  148.         {8, -1},
  149.         {8, -3},
  150.         {7, -5},
  151.         {6, -6},
  152.         {5, -7},
  153.         {3, -8},
  154.         {1, -8},
  155.         {0, -9},
  156.         {-1, -8},
  157.         {-3, -8},
  158.         {-5, -7},
  159.         {-6, -6},
  160.         {-7, -5},
  161.         {-8, -3},
  162.         {-8, -1},
  163.         {-9, 0},
  164.         {-8, 1},
  165.         {-8, 3},
  166.         {-7, 5},
  167.         {-6, 6},
  168.         {-5, 7},
  169.         {-3, 8},
  170.         {-1, 8},
  171.         {0, 9},
  172.     };
  173.     /* ショット用・第2形態円形大 */
  174.     signed short shot_pos1[16][2] =
  175.     {
  176.         {0, 50},
  177.         {19, 46},
  178.         {35, 35},
  179.         {46, 19},
  180.         {50, 0},
  181.         {46, -19},
  182.         {35, -35},
  183.         {19, -46},
  184.         {0, -50},
  185.         {-19, -46},
  186.         {-35, -35},
  187.         {-46, -19},
  188.         {-50, 0},
  189.         {-46, 19},
  190.         {-35, 35},
  191.         {-19, 46},
  192.  
  193.     };
  194.     /* ショット用・第2形態円形中 */
  195.     signed short shot_pos2[8][2] =
  196.     {
  197.         {0, 35},
  198.         {24, 24},
  199.         {35, 0},
  200.         {24, -24},
  201.         {0, -35},
  202.         {-24, -24},
  203.         {-35, 0},
  204.         {-24, 24},
  205.     };
  206.     /* ショット用・第2形態円形小 */
  207.     signed short shot_pos3[8][2] =
  208.     {
  209.         {0, 20},
  210.         {14, 14},
  211.         {20, 0},
  212.         {14, -14},
  213.         {0, -20},
  214.         {-14, -14},
  215.         {-20, 0},
  216.         {-14, 14},
  217.     };
  218.     short h;
  219.  
  220.  
  221.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  222.     p->x = (p->lx += p->vx) >> 16;
  223.     p->y = (p->ly += p->vy) >> 16;
  224.     p->timer++;
  225.  
  226.     switch (p->seq) {
  227.     case 0:
  228.         if (SHORT_LY > 48) {
  229.             p->seq++;
  230.             p->m_work = 0;
  231.         }
  232.         break;
  233.     case 1:        /* 減速 */
  234.         p->vy -= 4096;
  235.         if (p->vy < 4096) {
  236.             p->seq++;
  237.             p->vy = 0;
  238.             p->m_work = MOVETO_INIT;    /* 移動方向 */
  239.         }
  240.         switch (p->m_work++) {
  241.         case 2:
  242.             p->parts1 = EnemyInit (ENEMY_LBOSS03U, 111, 256 + 66, 0 + p->arg * 4, p);    /* パーツ1出現 */
  243.             break;
  244.         case 7:
  245.             p->parts2 = EnemyInit (ENEMY_LBOSS03U, 177, 256 + 66, 1 + p->arg * 4, p);    /* パーツ2出現 */
  246.             break;
  247.         case 5:
  248.             p->parts3 = EnemyInit (ENEMY_LBOSS03U, 111, 256 + 66, 2 + p->arg * 4, p);    /* パーツ3出現 */
  249.             break;
  250.         case 9:
  251.             p->parts4 = EnemyInit (ENEMY_LBOSS03U, 177, 256 + 66, 3 + p->arg * 4, p);    /* パーツ4出現 */
  252.             break;
  253.         }
  254.         break;
  255.     case 2:
  256.         if ((p->parts1->seq == 1) && (p->parts2->seq == 1)
  257.             && (p->parts3->seq == 1) && (p->parts4->seq == 1)) {
  258.             p->seq++;
  259.             p->parts1->seq++;
  260.             p->parts2->seq++;
  261.             p->parts3->seq++;
  262.             p->parts4->seq++;
  263.             p->pt = obj_lboss03 + 16;
  264.             p->angle = 0;    /* 角度(0~8) */
  265.             SoundSetSE (SE_LOCK_M);    /* 「がちゃん」という効果音を鳴らす */
  266.         }
  267.         break;
  268.     case 3:        /* パーツが「がちゃん」とくっつくアニメーション */
  269.         p->pt++;
  270.         if (p->pt >= obj_lboss03 + 33) {
  271.             p->seq++;
  272.             p->pt = obj_lboss03;
  273.             p->work2 = 0;    /* 角度の加速度に使用 */
  274.             p->work3 = 0;    /* パーツを破壊した数 */
  275.             p->angle = 0;    /* 角度に使用 */
  276.             p->parts1 = EnemyInit (ENEMY_LBOSS03P, 0, 0, 0 + p->arg * 4, p);    /* パーツ1出現 */
  277.             p->parts2 = EnemyInit (ENEMY_LBOSS03P, 0, 0, 1 + p->arg * 4, p);    /* パーツ2出現 */
  278.             p->parts3 = EnemyInit (ENEMY_LBOSS03P, 0, 0, 2 + p->arg * 4, p);    /* パーツ3出現 */
  279.             p->parts4 = EnemyInit (ENEMY_LBOSS03P, 0, 0, 3 + p->arg * 4, p);    /* パーツ4出現 */
  280.             p->s_work = 0;
  281.             SubEnemyMoveToInit (p, 144, 96, SPEED_1, SPEED_1N);
  282.         }
  283.         break;
  284.  
  285.     case 4:        /* 少し後退 */
  286.         if (SubEnemyMoveTo (p) < 0) {
  287.             p->seq++;
  288.             p->m_work = MOVETO_INIT;    /* 移動方向 */
  289.             p->s_work = 0;
  290.             p->s_work2 = 0;
  291.         }
  292.         break;
  293.  
  294.     case 5:        /* 第1形態 */
  295.         /* まず移動処理 */
  296.         if (p->m_work == MOVETO_INIT) {
  297.             /* 初期状態なら */
  298.             if (p->x > player->x)
  299.                 p->m_work = MOVETO_C2L;    /* 移動方向 */
  300.             else
  301.                 p->m_work = MOVETO_C2R;    /* 移動方向 */
  302.             p->m_work2 = 0;
  303.         }
  304.         if (p->m_work2 == 0) {
  305.             /* 初回なら */
  306.             signed short dx, dy;
  307.             signed short dx_table[5] =
  308.             {0, 54 + 16, 128 + 16, 256 - 54 + 16, 128 + 16};
  309.             short m_work_table[5] =
  310.             {MOVETO_INIT, MOVETO_L2C, MOVETO_C2R, MOVETO_R2C, MOVETO_C2L};
  311.  
  312.             p->m_work2 = !0;
  313.             /* 順に左→中央→右→中央→左へ移動 */
  314.             dx = dx_table[p->m_work];
  315.             p->m_work = m_work_table[p->m_work];
  316.  
  317.             /* player->y は乱数の種として使用しています */
  318.             if (SHORT_LY < 80)
  319.                 dy = (((unsigned short) rndtable[(player->y) & 0xff]) / 4 + 32 + 16);
  320.             else
  321.                 dy = 64;
  322.             /* 移動方向を設定 */
  323.             SubEnemyMoveToInit (p, dx, dy, SPEED_1, SPEED_1N);
  324.         } else {
  325.             /* 設定値に従って移動 */
  326.             if (SubEnemyMoveTo (p) < 0)
  327.                 p->m_work2 = 0;    /* 移動方向再設定 */
  328.         }
  329.  
  330.  
  331.         /* 攻撃&回転角の処理 */
  332.         p->s_work3 = 0;
  333.         switch (p->s_work) {
  334.         case 0:
  335.             if (p->s_work2++ > 120 * 5) {
  336.                 p->s_work++;
  337.                 p->s_work3 = !0;
  338.             }
  339.             if (p->work2 < 128)
  340.                 p->work2++;
  341.             p->angle += (p->work2 / 32);
  342.             break;
  343.         case 1:
  344.             if (p->s_work2++ > 120 * 4) {
  345.                 p->s_work++;
  346.                 p->s_work3 = !0;
  347.             }
  348.             if (p->work2 < 128)
  349.                 p->work2++;
  350.             p->angle -= (p->work2 / 32);
  351.             break;
  352.         case 2:
  353.             if (p->s_work2++ > 120 * 5) {
  354.                 p->s_work++;
  355.                 p->s_work3 = !0;
  356.             }
  357.             if (p->work2 < 128)
  358.                 p->work2++;
  359.             p->angle += (p->work2 / 32);
  360.             break;
  361.         case 3:
  362.             if (p->s_work2++ > 120 * 6) {
  363.                 p->s_work = 0;    /* 最初に戻る */
  364.                 p->s_work3 = !0;
  365.                 /* この時点でパーツを1個も破壊していなければコアが赤くなる */
  366.                 if (p->work3 == 0)
  367.                     p->core_info = PALET_CORE_RED | PRIORITY_BOSS_CORE;
  368.             }
  369.             if (p->work2 < 128)
  370.                 p->work2++;
  371.             p->angle -= (p->work2 / 32);
  372.             break;
  373.         }
  374.         if (p->s_work3) {
  375.             /* 今攻撃が変わったところ */
  376.             p->s_work2 = 0;
  377.             if (p->parts1)
  378.                 p->parts1->s_work = 0 * 7;
  379.             if (p->parts2)
  380.                 p->parts2->s_work = 1 * 7;
  381.             if (p->parts3)
  382.                 p->parts3->s_work = 2 * 7;
  383.             if (p->parts4)
  384.                 p->parts4->s_work = 3 * 7;
  385.             if (!eshot_erase)
  386.                 eshot_erase = ESHOT_ERASE;    /* 弾消し */
  387.         }
  388.         p->pt = obj_lboss03 + ((p->angle & 0x38) >> 3);
  389.  
  390.         /* パーツの有無を調べて全部なければ次の形態へ */
  391.         if ((p->parts1) && (p->parts1->child_death)) {
  392.             p->parts1 = 0;    /* これ以降参照しない */
  393.             p->work3++;
  394.         }
  395.         if ((p->parts2) && (p->parts2->child_death)) {
  396.             p->parts2 = 0;    /* これ以降参照しない */
  397.             p->work3++;
  398.         }
  399.         if ((p->parts3) && (p->parts3->child_death)) {
  400.             p->parts3 = 0;    /* これ以降参照しない */
  401.             p->work3++;
  402.         }
  403.         if ((p->parts4) && (p->parts4->child_death)) {
  404.             p->parts4 = 0;    /* これ以降参照しない */
  405.             p->work3++;
  406.         }
  407.         if (p->work3 >= 4)
  408.             p->seq++;
  409.         break;
  410.  
  411.     case 6:        /* 止まるまで待つ */
  412.         if (SubEnemyMoveToAbort (p) < 0) {
  413.             SubEnemyMoveToInit (p, 144, 96, SPEED_2, SPEED_2N);
  414.             p->seq++;
  415.             p->cwork = p->cwork2 = 0;
  416.         }
  417.         break;
  418.  
  419.     case 7:        /* 中央に移動 */
  420.         if (p->angle >= 2) {
  421.             p->angle -= 2;
  422.         } else {
  423.             p->angle = 0;
  424.             p->cwork = !0;
  425.         }
  426.         p->pt = obj_lboss03 + ((p->angle & 0x38) >> 3);
  427.         /* 設定値に従って移動 */
  428.         if (p->cwork2 == 0) {
  429.             if (SubEnemyMoveTo (p) < 0)
  430.                 p->cwork2 = !0;
  431.         }
  432.         if ((p->cwork) && (p->cwork2)) {
  433.             p->seq++;
  434.             p->m_work = 32;    /* コアの座標 */
  435.             p->m_work2 = 0;
  436.         }
  437.         break;
  438.     case 8:        /* コア集積 */
  439.         if (p->m_work2++ > 2) {
  440.             p->m_work2 = 0;
  441.             p->m_work--;
  442.             if (p->m_work <= 6) {
  443.                 p->seq++;
  444.                 SoundSetSE (SE_LOCK_M);    /* 「がちゃん」という効果音を鳴らす */
  445.                 p->cwork = 0;    /* コアの角度 */
  446.                 p->cwork2 = 0;
  447.                 p->m_work = MOVETO_INIT;    /* 移動方向 */
  448.                 p->s_work = p->s_work2 = p->s_work3 = p->s_work4 = p->s_angle = p->s_angle2 = 0;
  449.                 p->hit_px = 56;
  450.                 p->hit_py = 16;
  451.                 p->hit_sx = 56;
  452.                 p->hit_sy = 16;
  453.                 p->hit_cx = 12;
  454.             }
  455.         }
  456.         break;
  457.  
  458.     case 9:        /* 第2形態 */
  459.         if (p->timer > TIMER_TIMEOUT) {
  460.             p->seq++;    /* 時間切れ */
  461.             p->m_work = 0;
  462.             break;
  463.         }
  464.         /* まず移動処理 */
  465.         if (p->m_work == MOVETO_INIT) {
  466.             /* 初期状態なら */
  467.             if (p->x > player->x)
  468.                 p->m_work = MOVETO_C2L;    /* 移動方向 */
  469.             else
  470.                 p->m_work = MOVETO_C2R;    /* 移動方向 */
  471.             p->m_work2 = 0;
  472.         }
  473.         if (p->m_work2 == 0) {
  474.             /* 初回なら */
  475.             signed short dx, dy;
  476.             signed short dx_table[5] =
  477.             {0, 54 + 16, 128 + 16, 256 - 54 + 16, 128 + 16};
  478.             short m_work_table[5] =
  479.             {MOVETO_INIT, MOVETO_L2C, MOVETO_C2R, MOVETO_R2C, MOVETO_C2L};
  480.  
  481.             p->m_work2 = !0;
  482.             /* 順に左→中央→右→中央→左へ移動 */
  483.             dx = dx_table[p->m_work];
  484.             p->m_work = m_work_table[p->m_work];
  485.  
  486.             /* p->x+player->y は乱数の種として使用しています */
  487.             if (SHORT_LY < 80)
  488.                 dy = (((unsigned short) rndtable[(p->x + player->y) & 0xff]) / 4 + 48 + 16);
  489.             else
  490.                 dy = 64;
  491.             /* 移動方向を設定 */
  492.             SubEnemyMoveToInit (p, dx, dy, SPEED_1, SPEED_1N);
  493.         } else {
  494.             /* 設定値に従って移動 */
  495.             if (SubEnemyMoveTo (p) < 0)
  496.                 p->m_work2 = 0;    /* 移動方向再設定 */
  497.         }
  498.  
  499.         /* コアの回転処理 */
  500.         if ((unsigned char) p->cwork2 < 128)
  501.             p->cwork2 += 2;
  502.         p->cwork += ((unsigned char) p->cwork2 / 32);
  503.  
  504.  
  505.         /* 第2形態・攻撃処理 */
  506.         switch (p->s_work) {
  507.         case 0:
  508.             if (p->s_work2++ > 120 * 5) {
  509.                 p->s_work++;
  510.                 p->s_work2 = p->s_work3 = p->s_work4 = p->s_angle = p->s_angle2 = 0;
  511.                 if (!eshot_erase)
  512.                     eshot_erase = ESHOT_ERASE;    /* 弾消し */
  513.             }
  514.             if ((p->s_work2 > 20) && (p->s_work2 < 500)) {
  515.                 if (p->s_work3++ > 2) {
  516.                     p->s_work3 = 0;
  517.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_01, p->s_angle, 3);
  518.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_01, p->s_angle + 64, 3);
  519.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_01, p->s_angle + 128, 3);
  520.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_01, p->s_angle + 192, 3);
  521.                     p->s_angle += 5;
  522.                     SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  523.                 }
  524.             }
  525.             if (((p->s_work2 > 180) && (p->s_work2 < 250)) ||
  526.                 ((p->s_work2 > 380) && (p->s_work2 < 450))) {
  527.                 if (p->s_work4++ > 1) {
  528.                     p->s_work4 = 0;
  529.                     EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_02, p->s_angle2, 3);
  530.                     EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_02, p->s_angle2 + 64, 3);
  531.                     EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_02, p->s_angle2 + 128, 3);
  532.                     EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_02, p->s_angle2 + 192, 3);
  533.                     p->s_angle2 += 12;
  534.                     SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  535.                 }
  536.             }
  537.             break;
  538.         case 1:
  539. #define    INTERVAL9_11    20    /* 速い炸裂弾を撃つ間隔 */
  540.             switch (p->s_work2) {
  541.             case INTERVAL9_11 * 1:
  542.             case INTERVAL9_11 * 2:
  543.             case INTERVAL9_11 * 3:
  544.             case INTERVAL9_11 * 4:
  545.             case INTERVAL9_11 * 5:
  546.             case INTERVAL9_11 * 11:
  547.             case INTERVAL9_11 * 12:
  548.             case INTERVAL9_11 * 13:
  549.             case INTERVAL9_11 * 14:
  550.             case INTERVAL9_11 * 15:
  551.             case INTERVAL9_11 * 16:
  552.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 0, 3);
  553.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 2, 3);
  554.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 4, 3);
  555.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 6, 3);
  556.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 8, 3);
  557.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 10, 3);
  558.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 12, 3);
  559.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 14, 3);
  560.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 16, 3);
  561.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 18, 3);
  562.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 20, 3);
  563.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 22, 3);
  564.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 24, 3);
  565.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 26, 3);
  566.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 28, 3);
  567.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 30, 3);
  568.                 SoundSetSE (SE_EBOMB_L);
  569.                 break;
  570.             case INTERVAL9_11 * 1 + 1:
  571.             case INTERVAL9_11 * 2 + 1:
  572.             case INTERVAL9_11 * 3 + 1:
  573.             case INTERVAL9_11 * 4 + 1:
  574.             case INTERVAL9_11 * 5 + 1:
  575.             case INTERVAL9_11 * 11 + 1:
  576.             case INTERVAL9_11 * 12 + 1:
  577.             case INTERVAL9_11 * 13 + 1:
  578.             case INTERVAL9_11 * 14 + 1:
  579.             case INTERVAL9_11 * 15 + 1:
  580.             case INTERVAL9_11 * 16 + 1:
  581.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 1, 4);
  582.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 3, 4);
  583.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 5, 4);
  584.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 7, 4);
  585.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 9, 4);
  586.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 11, 4);
  587.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 13, 4);
  588.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 15, 4);
  589.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 17, 4);
  590.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 19, 4);
  591.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 21, 4);
  592.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 23, 4);
  593.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 25, 4);
  594.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 27, 4);
  595.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 29, 4);
  596.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT9_11, 8 * 31, 4);
  597.                 break;
  598.             default:
  599.                 break;
  600.             }
  601.  
  602. #define    INTERVAL9_12    27    /* 遅い炸裂弾を撃つ間隔 */
  603.             switch (p->s_work2) {
  604.             case INTERVAL9_12 * 1:
  605.             case INTERVAL9_12 * 2:
  606.             case INTERVAL9_12 * 3:
  607.             case INTERVAL9_12 * 4:
  608.             case INTERVAL9_12 * 8:
  609.             case INTERVAL9_12 * 9:
  610.             case INTERVAL9_12 * 10:
  611.             case INTERVAL9_12 * 11:
  612.             case INTERVAL9_12 * 12:
  613.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 0, 3);
  614.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 2, 3);
  615.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 4, 3);
  616.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 6, 3);
  617.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 8, 3);
  618.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 10, 3);
  619.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 12, 3);
  620.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 14, 3);
  621.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 16, 3);
  622.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 18, 3);
  623.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 20, 3);
  624.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 22, 3);
  625.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 24, 3);
  626.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 26, 3);
  627.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 28, 3);
  628.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 30, 3);
  629.                 SoundSetSE (SE_EBOMB_M);
  630.                 break;
  631.             case INTERVAL9_12 * 1 + 1:
  632.             case INTERVAL9_12 * 2 + 1:
  633.             case INTERVAL9_12 * 3 + 1:
  634.             case INTERVAL9_12 * 4 + 1:
  635.             case INTERVAL9_12 * 8 + 1:
  636.             case INTERVAL9_12 * 9 + 1:
  637.             case INTERVAL9_12 * 10 + 1:
  638.             case INTERVAL9_12 * 11 + 1:
  639.             case INTERVAL9_12 * 12 + 1:
  640.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 1, 4);
  641.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 3, 4);
  642.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 5, 4);
  643.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 7, 4);
  644.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 9, 4);
  645.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 11, 4);
  646.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 13, 4);
  647.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 15, 4);
  648.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 17, 4);
  649.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 19, 4);
  650.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 21, 4);
  651.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 23, 4);
  652.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 25, 4);
  653.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 27, 4);
  654.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 29, 4);
  655.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT9_12, p->s_angle2 + 8 * 31, 4);
  656.                 p->s_angle2 += 2;
  657.                 break;
  658.             default:
  659.                 break;
  660.             }
  661.             if (p->s_work2++ > 120 * 4) {
  662.                 p->s_work++;
  663.                 p->s_work2 = p->s_work3 = p->s_work4 = p->s_angle = p->s_angle2 = 0;
  664.                 if (!eshot_erase)
  665.                     eshot_erase = ESHOT_ERASE;    /* 弾消し */
  666.             }
  667.             break;
  668.         case 2:
  669. #define    INTERVAL9_2        90    /* 円形弾を撃つ間隔 */
  670.             switch (p->s_work2) {
  671.             case INTERVAL9_2 * 1:
  672.             case INTERVAL9_2 * 2:
  673.             case INTERVAL9_2 * 3:
  674.             case INTERVAL9_2 * 4:
  675.             case INTERVAL9_2 * 5:
  676.             case INTERVAL9_2 * 6:
  677.                 p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  678.                 for (h = 0; h < 16; h++)
  679.                     EshotInit (ESHOT_NRG02, p->x + shot_pos1[h][0], p->y + shot_pos1[h][1],
  680.                            SPEED_SHOT9_21, p->s_angle, 2);
  681.                 SoundSetSE (SE_EBOMB_M);
  682.                 break;
  683.             case INTERVAL9_2 * 1 + 1:
  684.             case INTERVAL9_2 * 2 + 1:
  685.             case INTERVAL9_2 * 3 + 1:
  686.             case INTERVAL9_2 * 4 + 1:
  687.             case INTERVAL9_2 * 5 + 1:
  688.             case INTERVAL9_2 * 6 + 1:
  689.                 for (h = 0; h < 8; h++)
  690.                     EshotInit (ESHOT_NRG03, p->x + shot_pos2[h][0], p->y + shot_pos2[h][1],
  691.                            SPEED_SHOT9_22, p->s_angle, 2);
  692.                 break;
  693.             case INTERVAL9_2 * 1 + 2:
  694.             case INTERVAL9_2 * 2 + 2:
  695.             case INTERVAL9_2 * 3 + 2:
  696.             case INTERVAL9_2 * 4 + 2:
  697.             case INTERVAL9_2 * 5 + 2:
  698.             case INTERVAL9_2 * 6 + 2:
  699.                 for (h = 0; h < 8; h++)
  700.                     EshotInit (ESHOT_NRG04, p->x + shot_pos3[h][0], p->y + shot_pos3[h][1],
  701.                            SPEED_SHOT9_23, p->s_angle, 2);
  702.                 break;
  703.             case INTERVAL9_2 * 1 + 3:
  704.             case INTERVAL9_2 * 2 + 3:
  705.             case INTERVAL9_2 * 3 + 3:
  706.             case INTERVAL9_2 * 4 + 3:
  707.             case INTERVAL9_2 * 5 + 3:
  708.             case INTERVAL9_2 * 6 + 3:
  709.                 EshotInit (ESHOT_NRG05, p->x, p->y, SPEED_SHOT9_24, p->s_angle, 2);
  710.                 break;
  711.             default:
  712.                 break;
  713.             }
  714.             if (p->s_work2++ > 120 * 5) {
  715.                 /* 最初に戻る */
  716.                 p->s_work = p->s_work2 = p->s_work3 = p->s_work4 = p->s_angle = p->s_angle2 = 0;
  717.                 if (!eshot_erase)
  718.                     eshot_erase = ESHOT_ERASE;    /* 弾消し */
  719.             }
  720.             break;
  721.         default:    /* ここに来たらバグ */
  722.             p->s_work = 0;    /* バグよけ */
  723.             break;
  724.         }
  725.  
  726.  
  727.         break;
  728.  
  729.     case SEQ_TIMEOUT:
  730.         switch (p->m_work) {
  731.         case 0:
  732.             if (SubEnemyMoveTo (p) < 0) {    /* 止まるまで待つ */
  733.                 p->m_work++;
  734.                 SubEnemyMoveToInit (p, 128 + 16, 160, SPEED_3, SPEED_3N);
  735.             }
  736.             break;
  737.         case 1:    /* 一旦中央まで移動してから撤退 */
  738.             if (SubEnemyMoveTo (p) < 0) {    /* 止まるまで待つ */
  739.                 p->m_work++;
  740.                 SubEnemyMoveToInit (p, p->x, -128, SPEED_3, SPEED_3N);
  741.             }
  742.             break;
  743.         case 2:
  744.             if (SubEnemyMoveTo (p) < 0) {    /* 止まるまで待つ */
  745.                 return (-1);    /* 消去 */
  746.             }
  747.             break;
  748.         }
  749.         break;
  750.  
  751.     case SEQ_DEATH:
  752.         switch (p->m_work) {
  753.         case 0:
  754.             if (SubEnemyMoveToAbort (p) < 0) {    /* 止まるまで待つ */
  755.                 p->m_work++;
  756.                 p->m_work2 = 0;
  757.                 p->m_work3 = 0;
  758.                 /* 当たり判定を無くす */
  759.                 p->hit_px = p->hit_py = p->hit_sx = p->hit_sy = p->hit_cx = 0;
  760.                 if (!eshot_erase)
  761.                     eshot_erase = ESHOT_ERASE;    /* 弾消し */
  762.             }
  763.             break;
  764.         case 1:
  765.             if (p->m_work2++ > 3) {
  766.                 p->m_work2 = 0;
  767.                 p->m_work3++;
  768.                 if (p->m_work3 < 15) {
  769.                     signed short x, y;
  770.                     x = rndtable[(p->timer) & 0xff ^ 0x55] - 128;
  771.                     y = rndtable[(p->timer) & 0xff ^ 0xaa] - 128;
  772.                     /* p->timer は乱数の種として使用しています */
  773.                     EffectInit (EFFECT_EXPL, 0, x / 2 + p->x, y / 4 + p->y);
  774.                     SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  775.                 }
  776.                 if (p->m_work3 > 20) {
  777.                     short h;
  778.                     for (h = 0; h < 6; h++) {
  779.                         EffectInit (EFFECT_EXPL, 0,
  780.                                 (signed short) ((rndtable[h] - 128) / 2) + p->x,
  781.                                 (signed short) ((rndtable[h + 1] - 128) / 2) + p->y);
  782.                     }
  783.                     SoundSetSE (SE_EXPL_L);    /* ボスキャラ爆発音 */
  784.                     if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS_CORE))
  785.                         EffectInit (EFFECT_POINTS_RED, POINTS_20000, p->x, p->y);
  786.                     else
  787.                         EffectInit (EFFECT_POINTS_BLUE, POINTS_9000, p->x, p->y);
  788.                     EffectInit (EFFECT_HAHEN, 0, p->x, p->y);
  789.  
  790.                     return (-1);    /* 消去 */
  791.                 }
  792.             }
  793.             break;
  794.         }
  795.         break;
  796.     default:
  797.         break;
  798.     }
  799.  
  800.  
  801.     /* 画面外に出たら消去 */
  802.     if (SHORT_LY > 256 + 32)
  803.         return (-1);    /* 消去 */
  804.  
  805.     /* 自機ショットに当たった時の処理 */
  806.     if (p->damage) {
  807.         if (p->damage_core) {
  808.             SoundSetSE (SE_CORE_DAMAGE);
  809.             p->info = PALET_RED | PRIORITY_BOSS;
  810.             p->damage_core = 0;
  811.         } else {
  812.             SoundSetSE (SE_DAMAGE);
  813.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  814.         }
  815.         if ((p->hp -= p->damage) <= 0) {
  816.             /* 死んだ */
  817.             p->seq = SEQ_DEATH;
  818.             p->m_work = 0;
  819.         }
  820.         p->damage = 0;
  821.         p->flash = TIMER_FLASH_DAMAGE;
  822.     } else {
  823.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 500)) {
  824.             p->info = PALET_RED | PRIORITY_BOSS;
  825.             if (p->flash > TIMER_FLASH_NORMAL)
  826.                 p->flash = 0;
  827.         } else {
  828.             p->info = p->work4;
  829.         }
  830.     }
  831.     xobj_set_st (p);
  832.  
  833.     /* コアの表示 */
  834.     switch (p->seq) {
  835.     case 3:        /* コア外側に */
  836.     case 4:
  837.     case 5:
  838.     case 6:
  839.     case 7:
  840.         {
  841.             unsigned char a;
  842.             a = p->angle + 32 + 64 * 0;
  843.             a /= 8;
  844.             p->core_x = p->x + core_table1[a][0] - 8;
  845.             p->core_y = p->y - core_table1[a][1] - 8;
  846.             xsp_set_st (&(p->core_x));
  847.             a = p->angle + 32 + 64 * 1;
  848.             a /= 8;
  849.             p->core_x = p->x + core_table1[a][0] - 8;
  850.             p->core_y = p->y - core_table1[a][1] - 8;
  851.             xsp_set_st (&(p->core_x));
  852.             a = p->angle + 32 + 64 * 2;
  853.             a /= 8;
  854.             p->core_x = p->x + core_table1[a][0] - 8;
  855.             p->core_y = p->y - core_table1[a][1] - 8;
  856.             xsp_set_st (&(p->core_x));
  857.             a = p->angle + 32 + 64 * 3;
  858.             a /= 8;
  859.             p->core_x = p->x + core_table1[a][0] - 8;
  860.             p->core_y = p->y - core_table1[a][1] - 8;
  861.             xsp_set_st (&(p->core_x));
  862.         }
  863.         break;
  864.     case 8:        /* コア集積 */
  865.         p->core_x = p->x - p->m_work - 8;
  866.         p->core_y = p->y - p->m_work - 8;
  867.         xsp_set_st (&(p->core_x));
  868.         p->core_x = p->x + p->m_work - 8;
  869.         xsp_set_st (&(p->core_x));
  870.         p->core_y = p->y + p->m_work - 8;
  871.         xsp_set_st (&(p->core_x));
  872.         p->core_x = p->x - p->m_work - 8;
  873.         xsp_set_st (&(p->core_x));
  874.         break;
  875.     case 9:        /* コア内側に */
  876.     case SEQ_TIMEOUT:
  877.     case SEQ_DEATH:
  878.         {
  879.             unsigned char a;
  880.             a = p->cwork + 32 + 64 * 0;
  881.             a /= 8;
  882.             p->core_x = p->x + core_table2[a][0] - 8;
  883.             p->core_y = p->y - core_table2[a][1] - 8;
  884.             xsp_set_st (&(p->core_x));
  885.             a = p->cwork + 32 + 64 * 1;
  886.             a /= 8;
  887.             p->core_x = p->x + core_table2[a][0] - 8;
  888.             p->core_y = p->y - core_table2[a][1] - 8;
  889.             xsp_set_st (&(p->core_x));
  890.             a = p->cwork + 32 + 64 * 2;
  891.             a /= 8;
  892.             p->core_x = p->x + core_table2[a][0] - 8;
  893.             p->core_y = p->y - core_table2[a][1] - 8;
  894.             xsp_set_st (&(p->core_x));
  895.             a = p->cwork + 32 + 64 * 3;
  896.             a /= 8;
  897.             p->core_x = p->x + core_table2[a][0] - 8;
  898.             p->core_y = p->y - core_table2[a][1] - 8;
  899.             xsp_set_st (&(p->core_x));
  900.         }
  901.         break;
  902.     default:
  903.         break;
  904.     }
  905.     return (0);
  906. }
  907.  
  908.  
  909.  
  910. static void EnemyTiniLBoss03 (ENEMY * p)
  911. {
  912.     /* パーツが存在していたら消すように指示 */
  913.     if (p->parts1)
  914.         p->parts1->child_kill = !0;
  915.     if (p->parts2)
  916.         p->parts2->child_kill = !0;
  917.     if (p->parts3)
  918.         p->parts3->child_kill = !0;
  919.     if (p->parts4)
  920.         p->parts4->child_kill = !0;
  921.     entry_counter_stop = 0;    /* エントリーカウンター停止解除 */
  922. }
  923.